// src/store/slices/homepageSlice.ts
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import axios from '../api/request'; // 确保 axios 实例路径正确


// -------------------------- 1. 定义所有接口数据的 TypeScript 类型 --------------------------
/** 轮播图数据类型 */
interface BannerItem {
  title?: string;
  image_new: string; // 轮播图图片地址
  target_type: 'wx_mini' | 'html'; // 跳转类型
  mini_app_id?: string; // 小程序ID（target_type为wx_mini时存在）
  original_id?: string; // 公众号原始ID
  url?: string; // H5跳转地址（target_type为html时存在）
  check_group?: number; // 分组标识
  ad_id?: number; // 广告ID
}

/** 信任信息类型 */
interface BelieveInfo {
  left_text: string; // 左侧文本（如"国家卫健委认证医疗机构"）
  right_text: string; // 右侧文本（如"1.83亿用户信赖"）
  url: string; // 跳转地址
}

/** 购药/找医生快捷入口类型 */
interface QuickEntry {
  accessibility_desc: string; // 无障碍描述
  icon_url: string; // 图标地址
  jump_url?: string; // 跳转地址（购药入口有，找医生入口无）
}

/** 健康商城信息类型 */
interface HealthyMallInfo {
  item_list: unknown[]; // 商品列表（当前为空）
  show_more_url: string; // "查看更多"跳转地址
  text: string; // 标题（如"好货精选 健康安全"）
}

/** 重要位置入口类型（如图文急诊、电话问诊） */
interface ImportantPositionItem {
  desc: string; // 描述（如"微信小程序新版本"）
  h5_title: string;
  icon: string; // 图标地址
  jump_type: 'self_mini' | 'h5' | 'other_mini'; // 跳转类型
  jump_url: string; // 跳转地址
  login_required: boolean; // 是否需要登录
  mini_app_id?: string; // 其他小程序ID（jump_type为other_mini时存在）
  mini_original_id?: string;
  name: string; // 标识（如"second_endpoint"）
  tag_url?: string; // 标签图片地址
  text: string; // 入口名称（如"图文急诊"）
}

/** 运营信息-宽列表项类型 */
interface OperateListItem {
  bottom_icon: string;
  desc: string; // 描述（如"健康顾问 专家科普"）
  image: string; // 图片地址
  left_icon: string;
  see_more: string; // "查看更多"图标地址
  show_title: boolean; // 是否显示标题
  target_redirect: {
    target_scheme: string; // 跳转地址
    target_type: 'html';
    click_info: string; // 点击日志（JSON字符串）
  };
  title: string; // 标题（如"直播义诊"）
}

/** 搜索配置类型 */
interface SearchConfig {
  ad_keywords: unknown[]; // 广告关键词（当前为空）
  default_keywords: string[]; // 默认关键词（如["甲流", "益母草颗粒"]）
  keyword_icon: string; // 关键词图标地址
  placeholder: string; // 搜索框提示文本
}

/** 专科门诊卡片类型 */
interface SpecializedClinicCard {
  cy_redirect: {
    target_type: 'html';
    target_scheme: string; // 跳转地址
    click_info: string; // 点击日志（JSON字符串）
  };
  image: string; // 卡片图片地址
  title: string; // 卡片标题（如"首页男科卡片"）
}

/** 专科门诊整体类型 */
interface SpecializedClinic {
  card_list: SpecializedClinicCard[]; // 卡片列表
  sub_title: string; // 副标题（如"春雨高复诊率、高口碑名医"）
  title: string; // 标题（如"专科门诊"）
}

/** 精选医生信息类型 */
interface DoctorInfo {
  ad_tag: {
    name: string; // 标签名称（如"年度好医生"）
    tag_type: number;
    icon: string;
    enable: boolean;
    highlight: boolean;
  };
  can_pres: boolean; // 是否可开药
  clinic_name: string; // 科室名称（如"皮肤科"）
  comment_tag: string; // 医生简介（如"知名专家，从业37年"）
  cy_redirect: {
    target_type: 'html';
    click_info: string; // 点击日志（JSON字符串）
    target_scheme: string; // 医生详情跳转地址
  };
  doctor_id: string; // 医生ID
  good_at: string; // 擅长领域（带HTML标签的字符串）
  good_rate: string; // 好评率（如"5.0"）
  has_online_services: boolean; // 是否有在线服务
  hospital_id: string; // 医院ID
  hospital_name: string; // 医院名称（如"空军军医大学西京医院"）
  hospital_tag_text: string; // 医院标签（如"科室全国第3"）
  image: string; // 医生头像地址
  is_3a_hospital: boolean; // 是否三甲医院
  is_active: boolean; // 是否在线
  is_expert: boolean; // 是否专家
  is_online: boolean; // 是否在线
  is_recommend: boolean; // 是否推荐
  is_rest: boolean; // 是否休息
  is_top_100_hospital: boolean; // 是否百强医院
  list_order: number; // 排序序号
  name: string; // 医生姓名
  new_tags: unknown[]; // 新标签（当前为空）
  project_alias: string; // 项目标识（如"find_doctor_recommend"）
  qa_tags: string[]; // 问答标签（如["丘疹", "发疹"]）
  reply_num: string; // 回复数量（如"3.9万"）
  service_data_list: Array<Record<string, unknown>>; // 服务数据（具体结构可根据需求补充）
  service_list: Array<Record<string, unknown>>; // 服务列表（具体结构可根据需求补充）
  solution_score_desc: string; // 解决方案评分（如"100"）
  title: string; // 医生职称（如"副主任医师"）
  user_id: number | string; // 用户ID
}

/** 精选医生整体类型 */
interface StrictlySelectedDoctor {
  doctors: {
    doctor_info: DoctorInfo;
    doctor_type: number;
  }[]; // 医生列表
  see_more_redirect: {
    click_info: string; // 点击日志（JSON字符串）
    target_scheme: string; // 跳转地址
    target_type: 'native';
  };
}

/** 首页接口返回的完整数据类型 */
interface HomepageResponse {
  banners: BannerItem[]; // 轮播图
  believe_info: BelieveInfo; // 信任信息
  buy_drug_info: QuickEntry; // 购药入口
  find_doc_info: QuickEntry; // 找医生入口
  healthy_mall_info: HealthyMallInfo; // 健康商城
  hover_icon_ad: Record<string, unknown>; // 悬浮图标广告（当前为空）
  important_position: ImportantPositionItem[]; // 重要位置入口
  my_gold_url: string; // 我的金币页面地址
  operate_info: {
    full_width_list: unknown[]; // 全宽列表（当前为空）
    half_width_list: OperateListItem[]; // 半宽列表
  };
  qa_guide_info: Record<string, unknown>; // QA指南（当前为空）
  quick_ask_info: QuickEntry; // 快速问诊入口
  search_config: SearchConfig; // 搜索配置
  second_endpoint: ImportantPositionItem[]; // 二级入口（与important_position结构一致）
  sign_in_image: string; // 签到图标地址
  specialized_clinic: SpecializedClinic; // 专科门诊
  strictly_selected_doctor: StrictlySelectedDoctor; // 精选医生
  test_group_new_style: boolean; // 测试组样式标识
  toast_ads: unknown[]; // 弹窗广告（当前为空）
}

/** 切片初始状态类型 */
interface HomepageState {
  data: HomepageResponse | null; // 接口返回的完整数据
  isLoading: boolean; // 加载状态
  error: string | null; // 错误信息（null表示无错误）
  // 可根据需求添加细分状态，如单独的轮播图、医生列表状态
}


// -------------------------- 2. 创建异步请求 Action --------------------------
/**
 * 获取首页数据
 * 无需参数（接口本身不需要查询参数）
 */
export const fetchHomepageData = createAsyncThunk<
  HomepageResponse, // 成功返回类型
  void, // 入参类型（无参数）
  { rejectValue: string } // 错误返回类型
>('homepage/fetchData', async (_, { rejectWithValue }) => {
  try {
    const response = await axios.get<HomepageResponse>('/cooperation/wap/homepage_info/');
    // 接口返回的data就是首页完整数据（无需额外嵌套）
    return response.data;
  } catch (error) {
    // 错误处理：优先取接口返回的错误信息，无则用默认提示
    const maybeAxiosError = error as { response?: { data?: { message?: string } } };
    const errorMsg = maybeAxiosError.response?.data?.message || '获取首页数据失败，请稍后重试';
    return rejectWithValue(errorMsg);
  }
});


// -------------------------- 3. 创建切片（Slice） --------------------------
// 初始状态
const initialState: HomepageState = {
  data: null,
  isLoading: false,
  error: null,
};

const homepageSlice = createSlice({
  name: 'homepage', // 切片名称（唯一）
  initialState,
  reducers: {
    // 同步Action：可根据需求添加（如重置状态、更新单个字段）
    /** 重置首页状态 */
    resetHomepageState: (state) => {
      state.data = null;
      state.isLoading = false;
      state.error = null;
    },
  },
  extraReducers: (builder) => {
    builder
      // 1. 请求 pending（加载中）
      .addCase(fetchHomepageData.pending, (state) => {
        state.isLoading = true;
        state.error = null; // 清除之前的错误
      })
      // 2. 请求 fulfilled（成功）
      .addCase(fetchHomepageData.fulfilled, (state, action) => {
        state.isLoading = false;
        state.data = action.payload; // 存储完整的首页数据
      })
      // 3. 请求 rejected（失败）
      .addCase(fetchHomepageData.rejected, (state, action) => {
        state.isLoading = false;
        state.error = action.payload || '获取数据失败，请检查网络'; // 存储错误信息
      });
  },
});


// -------------------------- 4. 导出 Action 和 Reducer --------------------------
// 导出同步Action（如resetHomepageState）
export const { resetHomepageState } = homepageSlice.actions;

// 导出切片的Reducer（用于注册到Store）
export default homepageSlice.reducer;